package com.atguigu.tingshu.album.service.impl;

import com.atguigu.tingshu.album.mapper.*;
import com.atguigu.tingshu.album.service.AlbumInfoService;
import com.atguigu.tingshu.common.cache.GuiGuCache;
import com.atguigu.tingshu.common.constant.SystemConstant;
import com.atguigu.tingshu.common.execption.GuiguException;
import com.atguigu.tingshu.common.rabbit.constant.MqConst;
import com.atguigu.tingshu.common.rabbit.service.RabbitService;
import com.atguigu.tingshu.model.album.*;
import com.atguigu.tingshu.model.search.AlbumInfoIndex;
import com.atguigu.tingshu.query.album.AlbumInfoQuery;
import com.atguigu.tingshu.vo.album.*;
import com.atguigu.tingshu.vo.search.AlbumInfoIndexVo;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import cn.hutool.core.bean.BeanUtil;;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.binder.rabbit.properties.RabbitCommonProperties;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;

import java.util.List;

@Slf4j
@Service
@SuppressWarnings({"all"})
public class AlbumInfoServiceImpl extends ServiceImpl<AlbumInfoMapper, AlbumInfo> implements AlbumInfoService {

	@Autowired
	private AlbumInfoMapper albumInfoMapper;
	@Autowired
	private AlbumAttributeValueMapper albumAttributeValueMapper;
	@Autowired
	private BaseAttributeValueMapper attributeValueMapper;
	@Autowired
	private BaseAttributeMapper attributeMapper;
	@Autowired
	private AlbumStatMapper albumStatMapper;
	@Autowired
	private TrackInfoMapper trackInfoMapper;
	@Autowired
	private RabbitService rabbitService;
	@Autowired
	private RedisTemplate redisTemplate;

	@Override
	public void saveAlbumInfo(Long userId, AlbumInfoVo albumInfoVo) {
		AlbumInfo albumInfo = new AlbumInfo();
		BeanUtil.copyProperties(albumInfoVo,albumInfo);
		albumInfo.setUserId(userId);
		//1.2 手动为用户id、包含声音数量（0）、是否完结、免费试听集数、审核状态（TODO：审核通过，实则有内容审核机制）
		albumInfo.setIncludeTrackCount(0);
		albumInfo.setIsFinished("0");
		albumInfo.setTracksForFree(5);
		albumInfo.setStatus(SystemConstant.ALBUM_STATUS_PASS);
		baseMapper.insert(albumInfo);
		Long albumId = albumInfo.getId();

		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		//查询到标签与标签值的id集合   需要将两种id保存进AlbumAttributeValue表中 课件上并未明确是否添加name信息 但出于严谨性 查询后保存
		for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			albumAttributeValue.setAlbumId(albumInfo.getId());

			albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
			albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());

			albumAttributeValueMapper.insert(albumAttributeValue);
		}

		//3.保存专辑统计信息（4条）
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_PLAY, 0);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_SUBSCRIBE, 0);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_BUY, 0);
		this.saveAlbumStat(albumId, SystemConstant.ALBUM_STAT_COMMENT, 0);
		if ("1".equals(albumInfo.getIsOpen())){
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_UPPER,albumId);
		}
	}
	/**
	 * 保存专辑统计信息
	 * @param albumId 专辑ID
	 * @param statType 统计类型
	 * @param statNum 统计数量
	 */
	@Override
	public void saveAlbumStat(Long albumId, String statType, int statNum) {
		AlbumStat albumStat = new AlbumStat();
		albumStat.setAlbumId(albumId);
		albumStat.setStatType(statType);
		albumStat.setStatNum(statNum);
		albumStatMapper.insert(albumStat);
	}

	@Override
	public Page<AlbumListVo> getUserAlbumPage(Page<AlbumListVo> pageInfo, AlbumInfoQuery albumInfoQuery) {
		return baseMapper.getUserAlbumPage(pageInfo,albumInfoQuery);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void removeAlbumInfo(Long id) {
		//删除专辑需要删除与之对应的中间表 有标签中间表和统计中间表
		//track_info 注：声音表与专辑有关 需要先判断声音表是否存在与之对应的声音数据 若存在则抛出异常 返回需要先删除与之对应的声音表
		TrackInfo trackInfo = trackInfoMapper.selectOne(new LambdaQueryWrapper<TrackInfo>().eq(TrackInfo::getAlbumId, id));
		if(trackInfo!=null){
			throw new GuiguException(500,"声音表数据未删除完毕");
		}
		//删除专辑表数据album_info
		baseMapper.delete(new LambdaQueryWrapper<AlbumInfo>().eq(AlbumInfo::getId,id));
		//删除标签表album_attribute_value
		albumAttributeValueMapper.delete(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,id));
		//删除专辑统计表album_stat
		albumStatMapper.delete(new LambdaQueryWrapper<AlbumStat>().eq(AlbumStat::getAlbumId,id));
		redisTemplate.delete("albumInfo:"+id);

		rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_LOWER,id);
	}

	@Override
	public AlbumInfo getAlbumInfo(Long id) {
		AlbumInfo albumInfo = baseMapper.selectById(id);
		Assert.notNull(albumInfo,"不存在该专辑");
		List<AlbumAttributeValue> albumAttributeValues = albumAttributeValueMapper.selectList(new LambdaQueryWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId, id));
		albumInfo.setAlbumAttributeValueVoList(albumAttributeValues);
		return albumInfo;
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateAlbumInfo(Long id,AlbumInfoVo albumInfoVo) {
		//修改专辑 如果对中间表的数据进行修改的话会进行多次判断和修改 不如直接将中间表的数据进行删除 然后进行新增操作
		//用户需要进行登录后才可以通过网关鉴权 所以无需担心登录问题
		albumAttributeValueMapper.delete(new LambdaUpdateWrapper<AlbumAttributeValue>().eq(AlbumAttributeValue::getAlbumId,id));
		List<AlbumAttributeValueVo> albumAttributeValueVoList = albumInfoVo.getAlbumAttributeValueVoList();
		Assert.notNull(albumAttributeValueVoList,"修改标签数据为无");
		for (AlbumAttributeValueVo albumAttributeValueVo : albumAttributeValueVoList) {
			AlbumAttributeValue albumAttributeValue = new AlbumAttributeValue();
			albumAttributeValue.setAlbumId(id);
			albumAttributeValue.setAttributeId(albumAttributeValueVo.getAttributeId());
			albumAttributeValue.setValueId(albumAttributeValueVo.getValueId());
			albumAttributeValueMapper.insert(albumAttributeValue);
		}


		AlbumInfo albumInfo = BeanUtil.copyProperties(albumInfoVo, AlbumInfo.class);
		albumInfo.setId(id);
		redisTemplate.delete("albumInfo:"+albumInfo.getId());
		baseMapper.updateById(albumInfo);
		if ("1".equals(albumInfo.getIsOpen())){
			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_UPPER,albumInfo.getId());
		}else {

			rabbitService.sendMessage(MqConst.EXCHANGE_ALBUM,MqConst.ROUTING_ALBUM_LOWER,albumInfo.getId());
		}
	}

	/**
	 * 查询当指定用户专辑列表
	 * @param userId
	 * @return
	 */
	@Override
	public List<AlbumInfo> getUserAllAlbumList(Long userId) {
		//1.创建条件构造器封装查询条件
		LambdaQueryWrapper<AlbumInfo> queryWrapper = new LambdaQueryWrapper<>();
		queryWrapper.eq(AlbumInfo::getUserId, userId);
		//2.指定查询字段 select 后面列名称
		queryWrapper.select(AlbumInfo::getId, AlbumInfo::getAlbumTitle, AlbumInfo::getStatus);
		//3.TODO 避免小程序响应1千多条记录导致卡顿 需要指定加载数量  limit 200
		queryWrapper.last("limit 200");
		//4.设置排序按照最新专辑
		queryWrapper.orderByDesc(AlbumInfo::getId);
		return albumInfoMapper.selectList(queryWrapper);
	}

	@Override
	public AlbumStatVo getAlbumStatVo(Long albumId) {

		return albumInfoMapper.getAlbumStatVo(albumId);
	}

}
